// 一道题 
// 定义一个方法，传入string类型参数，然后将string的每个字符间加空格返回

// 也可以接受
function spacify(string) {
  let arr = []
  for (let i = 0; i < string.length; i++) {
    arr.push(string[i] + ' ')
  }
  let str = arr.toString()
  return str
}
console.log(spacify('hello'));
// 好的候选人
function spacif(params) {
  return params.split('').join(' ')
}
console.log(spacif('hello world'))

// 深入：如何把这个方法放入String对象上面，'hello'.spacify()
String.prototype.spac = function () {
  return this.split('').join(' ')
}
console.log('hello'.spac())



// 再问：解释一下函数声明和函数表达式的区别
// 参考博客
// https://blog.csdn.net/qq_41846861/article/details/92692268
function f() { console.log('I am outside!'); }
(function () {
  function f() { console.log('I am inside!'); }
  f();
})(); // addition:立即执行函数的作用

var f = function fact(x) {
  if (x <= 1)
    return 1;
  else
    return x * fact(x - 1);
};
alert(fact());   // Uncaught ReferenceError: fact is not defined 只能在函数内部调用，函数表达式的函数名相当于局部变量

// https://www.cnblogs.com/chaoyuehedy/p/9110063.html
var a = 'hello'
function func() {
  // addition:闭包的理解
  console.log(a); // 闭包可以访问外部作用域变量 log(a) === log(this.a) 
  var a = 'world' // 变量提升覆盖全局变量a
  console.log(a);
}
func() // undefined world

// 函数声明提升整个函数（包括函数体）
sayTruth();
function sayTruth() {
  console.log('myvin is handsome.')
}
// 同理 只是变量声明提升，不会初始化
sayTruth(); // TypeError: sayTruth is not a function
var sayTruth = function () {
  console.log('myvin is handsome.')
}


// 好了这道题终于过去了


